package com.makingTeam.config.mqttAndNetty;


import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.mqtt.MqttMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.concurrent.ConcurrentHashMap;

/**
 * @author pzy
 * handlder处理器
 *
 * SimpleChannelInboundHandler
 * 会自动检查消息类型是否与泛型参数指定的类型匹配。如果匹配，则继续处理；
 * 如果不匹配，则通过ctx.fireChannelRead(msg)将消息传递给下一个ChannelInboundHandler
 *
 * 对于匹配的消息，SimpleChannelInboundHandler会自动将其从Object类型转换为泛型参数指定的类型，并传递给channelRead0方法。
 * 这避免了在ChannelInboundHandlerAdapter中手动进行类型转换的需要。
 *
 *
 * SimpleChannelInboundHandler在处理完消息后，会根据autoRelease属性的值自动释放消息对象占用的资源（如ByteBuf的内存）
 * 这是通过调用ReferenceCountUtil.release(msg)实现的，避免了手动释放资源的繁琐操作。
 * 相比之下，ChannelInboundHandlerAdapter需要开发者在适当的时候手动释放资源。

 */
@Slf4j
@Component
@ChannelHandler.Sharable
public class ServerMqttHandler extends SimpleChannelInboundHandler<MqttMessage> {

    public static final ConcurrentHashMap<String, ChannelHandlerContext> clientMap = new ConcurrentHashMap<String, ChannelHandlerContext>();

    /**
     * 能自动释放占用的资源
     * @param channelHandlerContext
     * @param mqttMessage
     * @throws Exception
     */
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, MqttMessage mqttMessage) throws Exception {
        log.info("channelRead0");
        if (mqttMessage==null) return;

    }


    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.printStackTrace();
        ctx.close();
    }
}
